﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ComponentModel;
using System.Collections.ObjectModel;
using RiskMan.DataClass.Models.NotBasModels;

namespace RiskMan.DataClass.Models.Level
{
    /// <summary>
    /// Модель данных для строки Level
    /// </summary>
    [Serializable]
    public class LevelItem : INotifyPropertyChanged, ISerializable
    {
        #region private

        private bool _checked = false;

        //Базовые настройки
        private string _Account;
        private string _clientCode;
        private string _Instrument;
        private bool _isRun;
        private Guid _guidLevelItem;
        private string _comment;
        //рабочие настройки робота
        private string _typeLevel;
        private double _curValueLevel;
        private double _excess;
        private double _breakeven;
        private double _breakevenOtstup;
        private bool _breakevenActive;
        private DateTime _timeKillStopOrder;

        private int _Quantity;
        private int _curPosition;
        private string _Operation;
        private double _priceOpenPoz;
        private double _LastPrice;
        private double _PrevLastPrice;
        
        private int _numberOfAttempt;
        private int _curNumberOfAttempt;
        private ObservableCollection<TradesOpen> _TradeList;
        private TrendItem _trendItem;

        //звуковое оповещение
        private bool _soundOrder;
        private bool _soundOpenPoz;
        private bool _soundClosePoz;

        private SettingOrderOpenClosePoz _SettingOrderOpenClose;


        #endregion

        #region public

        /// <summary>
        /// Время сняти стопа
        /// </summary>
        public DateTime TimeKillStopOrder
        {
            get { return _timeKillStopOrder; }
            set
            {
                if (_timeKillStopOrder != value)
                {
                    _timeKillStopOrder = value;
                    RaisePropertyChanged("TimeKillStopOrder");
                }
            }
        }

        /// <summary>
        /// покзаывает активиован ли безубыток или нет
        /// </summary>
        public bool BreakevenActive
        {
            get { return _breakevenActive; }
            set
            {
                if (_breakevenActive != value)
                {
                    _breakevenActive = value;
                    RaisePropertyChanged("BreakevenActive");
                }
            }
        }
        /// <summary>
        /// количество пунктов, через которое стоп переноситься в безубыток
        /// </summary>
        public double Breakeven
        {
            get { return _breakeven; }
            set
            {
                if (_breakeven != value)
                {
                    _breakeven = value;
                    RaisePropertyChanged("Breakeven");
                }
            }
        }
        /// <summary>
        /// Величина, на которую перевыставиться стоп от цены уровня при перевыставлении в безубыток
        /// </summary>
        public double BreakevenOtstup
        {
            get { return _breakevenOtstup; }
            set
            {
                if (_breakevenOtstup != value)
                {
                    _breakevenOtstup = value;
                    RaisePropertyChanged("BreakevenOtstup");
                }
            }
        }
        /// <summary>
        /// выделен элемент для выполенения операции или нет
        /// </summary>
        public bool Check
        {
            get { return _checked; }
            set
            {
                if (_checked != value)
                {
                    _checked = value;
                    RaisePropertyChanged("Check");
                }
            }
        }

        /// <summary>
        /// Торговый счет
        /// </summary>
        public string Account
        {
            get { return _Account; }
            set
            {
                if (_Account != value)
                {
                    _Account = value;
                    RaisePropertyChanged("Account");
                }
            }
        }

        /// <summary>
        /// Комментарий последнего действия робота
        /// </summary>
        public string Comment
        {
            get { return _comment; }
            set
            {
                if (_comment != value)
                {
                    _comment = value;
                    RaisePropertyChanged("Comment");
                }
            }
        }

        /// <summary>
        /// Счет депо
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Торгуемый инструмент
        /// </summary>
        public string Instrument
        {
            get { return _Instrument; }
            set
            {
                if (_Instrument != value)
                {
                    _Instrument = value;
                    RaisePropertyChanged("Instrument");
                }
            }
        }

        /// <summary>
        /// Запуск/остановка работы по данному инструменту
        /// </summary>
        public bool isRun
        {
            get { return _isRun; }
            set
            {
                if (_isRun != value)
                {
                    _isRun = value;
                    RaisePropertyChanged("isRun");
                }
            }
        }

        /// <summary>
        /// Тип уровня либо тренд, либо горизонтальная
        /// </summary>
        public string TypeLevel
        {
            get { return _typeLevel; }
            set
            {
                if (_typeLevel != value)
                {
                    _typeLevel = value;
                    RaisePropertyChanged("TypeLevel");
                }
            }
        }

        /// <summary>
        /// текущее значение уровня
        /// </summary>
        public double CurValueLevel
        {
            get { return _curValueLevel; }
            set
            {
                if (_curValueLevel != value)
                {
                    _curValueLevel = value;
                    RaisePropertyChanged("CurValueLevel");
                }
            }
        }

        /// <summary>
        /// величина, на которую должен быть пробит уровень для входа в позицию
        /// </summary>
        public double Excess
        {
            get { return _excess; }
            set
            {
                if (_excess != value)
                {
                    _excess = value;
                    RaisePropertyChanged("Excess");
                }
            }
        }

      
        /// <summary>
        /// Количество контрактов/лотов, в одной выставляемой заявке
        /// </summary>
        public int Quantity
        {
            get { return _Quantity; }
            set
            {
                if (_Quantity != value)
                {
                    _Quantity = value;
                    RaisePropertyChanged("Quantity");
                }
            }
        }

        /// <summary>
        /// текущая позиция по уровню и инструменту
        /// </summary>
        public int CurPosition
        {
            get { return _curPosition; }
            set
            {
                if (_curPosition != value)
                {
                    _curPosition = value;
                    RaisePropertyChanged("CurPosition");
                }
            }
        }


        /// <summary>
        /// Вид операции по инструменту
        /// </summary>
        public string Operation
        {
            get { return _Operation; }
            set
            {
                if (_Operation != value)
                {
                    _Operation = value;
                    RaisePropertyChanged("Operation");
                }
            }
        }
        /// <summary>
        /// Цена открытия позиции
        /// </summary>
        public double PriceOpenPoz
        {
            get { return _priceOpenPoz; }
            set
            {
                if (_priceOpenPoz != value)
                {
                    _priceOpenPoz = value;
                    RaisePropertyChanged("PriceOpenPoz");
                }
            }
        }

        /// <summary>
        /// Количество попыток для входа
        /// </summary>
        public int NumberOfAttempt
        {
            get { return _numberOfAttempt; }
            set
            {
                if (_numberOfAttempt != value)
                {
                    _numberOfAttempt = value;
                    RaisePropertyChanged("NumberOfAttempt");
                }
            }
        }
        /// <summary>
        /// текущее значение попыток
        /// </summary>
        public int CurNumberOfAttempt
        {
            get { return _curNumberOfAttempt; }
            set
            {
                if (_curNumberOfAttempt != value)
                {
                    _curNumberOfAttempt = value;
                    RaisePropertyChanged("CurNumberOfAttempt");
                }
            }
        }
        /// <summary>
        /// коллекция активнных и исполненных сделок на открытие и закрытие позиции
        /// </summary>
        public ObservableCollection<TradesOpen> TradeList
        {
            get { return _TradeList; }
            set
            {
                if (_TradeList != value)
                {
                    _TradeList = value;
                    RaisePropertyChanged("TradeList");
                }
            }
        }

        /// <summary>
        /// тип уровня и его настройки
        /// </summary>
        public TrendItem trendItem
        {
            get { return _trendItem; }
            set
            {
                if (_trendItem != value)
                {
                    _trendItem = value;
                    RaisePropertyChanged("trendItem");
                }
            }
        }

        /// <summary>
        /// Настройки типов заявок и стоп-заявок на открытие и закрытие позиций
        /// </summary>
        public SettingOrderOpenClosePoz SettingOrderOpenClose
        {
            get { return _SettingOrderOpenClose; }
            set
            {
                if (_SettingOrderOpenClose != value)
                {
                    _SettingOrderOpenClose = value;
                    RaisePropertyChanged("SettingOrderOpenClose");
                }
            }
        }

        /// <summary>
        /// цена последней сделки
        /// </summary>
        public double LastPrice
        {
            get { return _LastPrice; }
            set
            {
                if (_LastPrice != value)
                {
                    _LastPrice = value;
                    RaisePropertyChanged("LastPrice");
                }
            }
        }

        /// <summary>
        /// цена предпоследней сделки
        /// </summary>
        public double PrevLastPrice
        {
            get { return _PrevLastPrice; }
            set
            {
                if (_PrevLastPrice != value)
                {
                    _PrevLastPrice = value;
                    RaisePropertyChanged("PrevLastPrice");
                }
            }
        }

        /// <summary>
        /// уникальный номер уровня, чтоб не терялся при сортировке
        /// </summary>
        public Guid GuidLevelItem
        {
            get { return _guidLevelItem; }
            set
            {
                if (_guidLevelItem != value)
                {
                    _guidLevelItem = value;
                    RaisePropertyChanged("GuidLevelItem");
                }
            }
        }

     

        #region Звуковое оповещение
        /// <summary>
        /// Звуковое сообщение о выставлении заявки
        /// </summary>
        public bool SoundOrder
        {
            get { return _soundOrder; }
            set
            {
                if (_soundOrder != value)
                {
                    _soundOrder = value;
                    RaisePropertyChanged("SoundOrder");
                }
            }
        }

        /// <summary>
        /// Звуковое сообщение о открытии позиции
        /// </summary>
        public bool SoundOpenPoz
        {
            get { return _soundOpenPoz; }
            set
            {
                if (_soundOpenPoz != value)
                {
                    _soundOpenPoz = value;
                    RaisePropertyChanged("SoundOpenPoz");
                }
            }
        }

        /// <summary>
        /// Звуковое сообщение о закрытии позиции позиции
        /// </summary>
        public bool SoundClosePoz
        {
            get { return _soundClosePoz; }
            set
            {
                if (_soundClosePoz != value)
                {
                    _soundClosePoz = value;
                    RaisePropertyChanged("SoundClosePoz");
                }
            }
        } 
        #endregion


        #endregion

        public LevelItem() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public LevelItem(SerializationInfo info, StreamingContext context)
        {
            isRun = info.GetBoolean("isRun");
            Account = info.GetString("Account");
            ClientCode = info.GetString("ClientCode");
            Instrument = info.GetString("Instrument");
            GuidLevelItem = (Guid)info.GetValue("GuidLevelItem", typeof(Guid));

            TypeLevel = info.GetString("TypeLevel");
            CurValueLevel = info.GetDouble("CurValueLevel");
            Excess = info.GetDouble("Excess");
            Breakeven = info.GetDouble("Breakeven");
            BreakevenOtstup = info.GetDouble("BreakevenOtstup");

            Quantity = info.GetInt32("Quantity");
            CurPosition = info.GetInt32("CurPosition");
            Operation = info.GetString("Operation");
            PriceOpenPoz = info.GetDouble("PriceOpenPoz");
            LastPrice = info.GetDouble("LastPrice");
            PrevLastPrice = info.GetDouble("PrevLastPrice");

            NumberOfAttempt = info.GetInt32("NumberOfAttempt");
            CurNumberOfAttempt = info.GetInt32("CurNumberOfAttempt");
            
            Check = info.GetBoolean("Check");
            TradeList = (ObservableCollection<TradesOpen>)info.GetValue("TradeList", typeof(ObservableCollection<TradesOpen>));
            trendItem = (TrendItem)info.GetValue("trendItem", typeof(TrendItem));
            SettingOrderOpenClose = (SettingOrderOpenClosePoz)info.GetValue("SettingOrderOpenClose", typeof(SettingOrderOpenClosePoz));
            

        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {

            info.AddValue("isRun", isRun);
            info.AddValue("Account", Account);
            info.AddValue("ClientCode", ClientCode);
            info.AddValue("Instrument", Instrument);
            info.AddValue("GuidLevelItem", GuidLevelItem);

            info.AddValue("TypeLevel", TypeLevel);
            info.AddValue("CurValueLevel", CurValueLevel);
            info.AddValue("Excess", Excess);
            info.AddValue("Breakeven", Breakeven);
            info.AddValue("BreakevenOtstup", BreakevenOtstup);

            info.AddValue("Quantity", Quantity);
            info.AddValue("CurPosition", CurPosition);
            info.AddValue("Operation", Operation);
            info.AddValue("PriceOpenPoz", PriceOpenPoz);
            info.AddValue("LastPrice", LastPrice);
            info.AddValue("PrevLastPrice", PrevLastPrice);


            info.AddValue("NumberOfAttempt", NumberOfAttempt);
            info.AddValue("CurNumberOfAttempt", CurNumberOfAttempt);

            info.AddValue("TradeList", _TradeList);
            info.AddValue("Check", Check);
            info.AddValue("trendItem", trendItem);
            info.AddValue("SettingOrderOpenClose", SettingOrderOpenClose);

        }

    }
}
